package persistencia;

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import dominio.comun.IMovible;
import dominio.fantasma.IFantasma;
import dominio.juego.IJuegoRepository;
import dominio.juego.Juego;
import dominio.laberinto.Laberinto;
import dominio.pacman.Pacman;

public class XMLJuegoRepository implements IJuegoRepository {

	private String path;
	private int iteracion;
	private XMLFantasmaRepository fantasmaRepository;
	private XMLPacmanRepository pacmanRepository;

	public XMLJuegoRepository(String path) {
		this.path = path;
		this.iteracion = 1;
		this.fantasmaRepository = new XMLFantasmaRepository();
		this.pacmanRepository = new XMLPacmanRepository();
	}

	@Override
	public Juego cargar() {
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(this.path);
			Element elemRaiz = document.getRootElement();
			this.fantasmaRepository.setElemRaiz(elemRaiz);
			this.pacmanRepository.setElemRaiz(elemRaiz);
			return this.cargar(elemRaiz);
		} catch (DocumentException ex) {
			throw new RuntimeException();
		}
	}

	@SuppressWarnings("unchecked")
	private Juego cargar(Element elemRaiz) {
		int puntaje = Integer.parseInt(elemRaiz.attributeValue("puntaje"));
		boolean finJuego = Boolean.parseBoolean(elemRaiz.attributeValue("finJuego"));

		Pacman pacman = this.pacmanRepository.cargar();
		List<IFantasma> fantasmas = this.fantasmaRepository.listar();
		List<IMovible> movibles = new ArrayList<IMovible>();
		movibles.addAll((Collection<? extends IMovible>) fantasmas);
		
		Juego juego = Juego.getInstance();
		juego.setPuntaje(puntaje);
		juego.setFinJuego(finJuego);
		juego.setPacman(pacman);
		juego.setFantasmas(movibles);

		return juego;
	}

	@Override
	public void guardar(Juego juego) {
		Document doc = DocumentHelper.createDocument();
		doc.add(this.salvar(juego));
		try {
			String nombreArch= this.path.substring(0,this.path.lastIndexOf("."));
			FileWriter writer = new FileWriter(nombreArch +"Tick"+ this.iteracion + ".xml");
			doc.write(writer);
			writer.close();
		} catch (IOException e) {
			throw new RuntimeException();
		}
		this.iteracion++;
	}

	private Element salvar(Juego juego) {
		Element elemJuego = DocumentHelper.createElement("juego");
		Attribute puntaje = DocumentHelper.createAttribute(elemJuego, "puntaje", String.valueOf(juego.getPuntaje()));
		Attribute finJuego = DocumentHelper.createAttribute(elemJuego, "finJuego", String.valueOf(juego.isFinJuego()));
				
		this.pacmanRepository.setElemRaiz(elemJuego);
		this.pacmanRepository.guardar(Pacman.getInstance());
		
		elemJuego.add(puntaje);
		elemJuego.add(finJuego);
		
		this.fantasmaRepository.setElemRaiz(elemJuego);
		for (IMovible fantasma : juego.getFantasmas()) {
			this.fantasmaRepository.guardar((IFantasma) fantasma);
		}
		
		return elemJuego;
	}

}
